package simonby.top.annualring.adapter.controller;

import cn.dev33.satoken.stp.StpUtil;
import cn.dev33.satoken.util.SaResult;
import simonby.top.annualring.adapter.dto.LoginDTO;
import simonby.top.annualring.application.service.UserApplicationService;
import simonby.top.annualring.domain.model.User;
import simonby.top.annualring.infrastructure.security.PasswordEncryptionService;
import org.springframework.web.bind.annotation.*;

import java.util.Optional;

/**
 * 认证控制器
 * 处理用户认证相关的HTTP请求
 */
@RestController
@RequestMapping("/api/auth")
public class AuthController {
    
    private final UserApplicationService userApplicationService;
    private final PasswordEncryptionService passwordEncryptionService;

    public AuthController(UserApplicationService userApplicationService, 
                         PasswordEncryptionService passwordEncryptionService) {
        this.userApplicationService = userApplicationService;
        this.passwordEncryptionService = passwordEncryptionService;
    }

    /**
     * 用户登录
     * @param loginDTO 登录信息
     * @return 登录结果
     */
    @PostMapping("/login")
    public SaResult login(@RequestBody LoginDTO loginDTO) {
        // 根据用户名查找用户
        Optional<User> userOptional = userApplicationService.getUserByUsername(loginDTO.getUsername());
        
        // 检查用户是否存在
        if (userOptional.isEmpty()) {
            return SaResult.error("用户不存在");
        }
        
        User user = userOptional.get();
        
        // 使用加密密码进行验证
        if (!passwordEncryptionService.matches(loginDTO.getPassword(), user.getPassword())) {
            // 添加日志以便调试
            System.out.println("密码验证失败: 用户名=" + loginDTO.getUsername() + 
                              ", 输入密码=" + loginDTO.getPassword() + 
                              ", 数据库密码=" + user.getPassword());
            return SaResult.error("密码错误");
        }
        
        // 检查用户状态
        if (user.getStatus() != 0) {
            return SaResult.error("用户状态异常");
        }
        
        // 使用Sa-Token进行登录
        StpUtil.login(user.getId());
        
        // 返回登录结果，包含token
        return SaResult.ok("登录成功").setData(StpUtil.getTokenValue());
    }

    /**
     * 用户登出
     * @return 登出结果
     */
    @PostMapping("/logout")
    public SaResult logout() {
        try {
            // 获取当前会话的token值
            String tokenValue = StpUtil.getTokenValue();
            
            // 检查token是否存在
            if (tokenValue != null && !tokenValue.isEmpty()) {
                // 使用令牌值进行登出
                StpUtil.logoutByTokenValue(tokenValue);
            } else {
                // 如果没有token，则使用普通登出方法
                StpUtil.logout();
            }
            
            return SaResult.ok("登出成功");
        } catch (Exception e) {
            // 即使出现异常，也返回成功，确保前端可以正常跳转
            return SaResult.ok("登出成功");
        }
    }

    /**
     * 检查登录状态
     * @return 登录状态
     */
    @GetMapping("/status")
    public SaResult status() {
        if (StpUtil.isLogin()) {
            return SaResult.ok("已登录").setData(StpUtil.getTokenInfo());
        } else {
            return SaResult.ok("未登录");
        }
    }
    
    /**
     * 获取当前登录用户信息
     * @return 用户信息
     */
    @GetMapping("/info")
    public SaResult info() {
        // 检查用户是否登录
        if (!StpUtil.isLogin()) {
            return SaResult.error("用户未登录");
        }
        
        // 获取当前登录用户的ID
        long userId = StpUtil.getLoginIdAsLong();
        
        // 根据ID获取用户信息
        Optional<User> userOptional = userApplicationService.getUserById(userId);
        if (userOptional.isEmpty()) {
            return SaResult.error("用户不存在");
        }
        
        User user = userOptional.get();
        // 清除密码字段，不返回给前端
        user.setPassword(null);
        
        // 返回用户信息
        return SaResult.ok("获取用户信息成功").setData(user);
    }
}